package com.wfm.leetcode.editor.cn;

import java.util.ArrayList;
import java.util.List;

/**
 * 划分字母区间
 * 2025-02-13 16:42:06
 *
 * 从左到右遍历字符串，遍历的同时维护当前片段的开始下标 start 和结束下标 end，初始时 start=end=0。
 *
 * 对于每个访问到的字母 c，得到当前字母的最后一次出现的下标位置 endc。则当前片段的结束下标一定不会小于 endc
 * 因此令 end=max(end,endc)
 *
 * 当访问到下标 end 时，当前片段访问结束，当前片段的下标范围是 [start,end]，
 * 长度为 end−start+1，将当前片段的长度添加到返回值，然后令 start=end+1，继续寻找下一个片段。
 *
 * 重复上述过程，直到遍历完字符串。
 * 时间复杂度 O(n)，
 * 空间复杂度 O(|Σ|)。|Σ|=26
 */
class PartitionLabels {

    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public List<Integer> partitionLabels(String s) {
        int[] last = new int[26];
        int length = s.length();
        for (int i = 0; i < length; i++) {
            last[s.charAt(i) - 'a'] = i;
        }
        List<Integer> partition = new ArrayList<Integer>();
        int start = 0, end = 0;
        for (int i = 0; i < length; i++) {
            end = Math.max(end, last[s.charAt(i) - 'a']);
            if (i == end) {
                partition.add(end - start + 1);
                start = end + 1;
            }
        }
        return partition;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

    public static void main(String[] args) {
        Solution solution = new PartitionLabels().new Solution();
        
    }
}